SUBROUTINE READDATA
!
! Verwendungszweck:
!  Einlesen von Anfangsmodellen
!
!  Die Routine versucht neben dem spezifizierten Startmodell auch ein
!  zugehoeriges Vorlaeufermodell zu lesen. Wenn das gelingt wird "tst" durch die
!  Zeitdifferenz der beiden eingelesenen Modelle ueberschrieben. Ansonsten bleibt
!  "tst" auf dem Wert aus dem par-file und es wird X_extrapol(:,:) = XA(:,:) gesetzt
!
!
!-----------------------------------------------------------------------
! Interne Variable:
!
!   np_         : Eingelesenes np zum Vergleichen
!   nv_          : Eingelesenes nv zum Vergleichen
!   tA           : Zeit des alten Modells, fuer die Berechng. von tst
!   rdummy       : real - dummy variable
!   idummy       : integer - dummy variable
!   idx          : Schleifenindex
!   modnrchar    : Die Modellnummer "modnr" als CHARACTER -Variable
!   modnrcharlen : Die Laenger von "modchar"
!   datfilelen   : Die Laenge von "datfile"
!   filename     : Name der Output-Files
!   filenamelen  : genutzte Wortlaenge in "filename"
!

      use config,  only : rkind, np
      use global,  only : datfile, modnr, t, tst, tsta, loglevel, relax
      use primvar, only : nv, XA, X_extrapol, &
                          MR, MD, ME, MUr, MUp, MJ, MH
      use physco,  only : z0, z1
      use zvar,    only : pseudo2D
      use RBvar,   only : M_star, L_star, R_in, rho0_in, e_in, R_out, rho0_out, e_out


      implicit none

      integer               :: np_, nv_, idx, datfilelen, modnrcharlen, filenamelen, idummy
      logical               :: pseudo2D_
      real(kind=rkind)      :: tA, rdummy
      character(len=3)      :: filetype ! '1D ' or '2D ' or '2C ' or '1DD'
      character(len=9)      :: modnrchar
      character(len=112)    :: filename   ! 2 mal 50 +".???????"+".dat"




!-----------------------------------------------------------------------
!  Einlesen des Daten-Files - aktueller Zeitpunkt
!-----------------------------------------------------------------------

! Zusammensetzen des Filenamens
      datfilelen = len_trim ( datfile )

      if(relax) then
         filename = datfile(1:datfilelen) // ".anf.dat"
         filenamelen = datfilelen + 8
      else
         write(modnrchar,"(I9)") modnr
         modnrchar = adjustl( modnrchar )
         modnrcharlen = len_trim( modnrchar )

         filename = datfile(1:datfilelen) // "." // modnrchar(1:modnrcharlen) // ".dat"
         filenamelen = datfilelen + 1 + modnrcharlen + 4
      end if


! Oeffnen des Datenfiles
      open(unit=10,file=filename,action="read",status="old",err=999)

! Lesen des Headers
         read(10,"(2xa3)") filetype !  '1D model file' '2D model file' '2C model file' '1DD model file'
         read(10,*) ! logfile reference
         read(10,*) ! code archive reference
         read(10,*) ! backup reference
         read(10,*) ! empty line
         read(10,*) ! description
         read(10,"(2xi8,1xi8,1xL1,9(1xES23.15E3))") np_, nv_, pseudo2D_, t, M_star, L_star, R_in, rho0_in, e_in, R_out, rho0_out, e_out
         read(10,*) ! empty line
         read(10,*) ! description
         read(10,*) ! description


! Testen der Kompabilitaet
         if (filetype /= '1DD') then
            write(* ,"(a,a,a)")"readdata.f90:   Das eingelesene ",filetype,"-Datenfile passt nicht zu der aktuellen Programmkonfiguration -> STOP"
            write(66,"(a,a,a)")"readdata.f90:   Das eingelesene ",filetype,"-Datenfile passt nicht zu der aktuellen Programmkonfiguration -> STOP"
            STOP
         end if

         if(np /= np_ .or. nv /= nv_ .or. pseudo2D .neqv. pseudo2D_) then
            write(* ,"(a,i4,a,i4,a,L1,a)")"readdata.f90:   Das eingelesene Datenfiles passt nicht zu der aktuellen Programmkonfiguration (np=",np," nv=",nv,", pseudo2D=",pseudo2D,") -> STOP"
            write(66,"(a,i4,a,i4,a,L1,a)")"readdata.f90:   Das eingelesene Datenfiles passt nicht zu der aktuellen Programmkonfiguration (np=",np," nv=",nv,", pseudo2D=",pseudo2D,") -> STOP"
            STOP
         end if

! Lesen der Daten und umsortieren der Gitterpunkte

         do idx = 1,np
            read(10,"(i8,7(1xES23.15E3))") &
            idummy, XA(MR,idx), XA(MD,idx), XA(ME,idx), XA(MUr,idx), XA(MUp,idx), XA(MJ,idx), XA(MH,idx)
         end do

! Schliessen des Datenfiles
      close(unit=10)

      if(loglevel >= 1) write(66,"(a,a)") "readdata.f90:   Modell-Datei eingelesen:", filename(1:filenamelen)





if(relax) goto 333 ! beim Relaxieren gibt es kein altes Daten-File einzulesen
!-----------------------------------------------------------------------
!  Einlesen des Daten-Files - alter Zeitpunkt
!-----------------------------------------------------------------------

! Zusammensetzen des Filenamens
      datfilelen = len_trim ( datfile )

      write(modnrchar,"(I9)") modnr-1
      modnrchar = adjustl( modnrchar )
      modnrcharlen = len_trim( modnrchar )

      filename = datfile(1:datfilelen) // "." // modnrchar(1:modnrcharlen) // ".dat"
      filenamelen = datfilelen + 1 + modnrcharlen + 4


! Oeffnen des Datenfiles
      open(unit=10,file=filename,action="read",status="old",err=333)

! Lesen des Headers
         read(10,"(2xa3)") filetype !  '1D model file' '2D model file' '2C model file' '1DD model file'
         read(10,*) ! logfile reference
         read(10,*) ! code archive reference
         read(10,*) ! backup reference
         read(10,*) ! empty line
         read(10,*) ! description
         read(10,"(2xi8,1xi8,6(1xES23.15E3))") np_, nv_, tA, rdummy, rdummy, rdummy, rdummy, rdummy
         read(10,*) ! empty line
         read(10,*) ! description
         read(10,*) ! description

! Testen der Kompabilitaet
         if (filetype /= '1DD') then
            write(* ,"(a,a,a)")"readdata.f90:   Das eingelesene ",filetype,"-Datenfile passt nicht zu der aktuellen Programmkonfiguration -> STOP"
            write(66,"(a,a,a)")"readdata.f90:   Das eingelesene ",filetype,"-Datenfile passt nicht zu der aktuellen Programmkonfiguration -> STOP"
            STOP
         end if

         if(np /= np_ .or. nv /= nv_) then
            write(* ,"(a,i4,a,i4,a)")"readdata.f90:   Das eingelesene Datenfiles passt nicht zu der aktuellen Programmkonfiguration (np=",np," nv=",nv,") -> STOP"
            write(66,"(a,i4,a,i4,a)")"readdata.f90:   Das eingelesene Datenfiles passt nicht zu der aktuellen Programmkonfiguration (np=",np," nv=",nv,") -> STOP"
            STOP
         end if

! Wenn im input-file tst = 0 spezifiziert wird: Berechnen des Zeitschrittes

         tsta = t - tA
         if(tst == z0) then
            tst = tsta
            if (loglevel >= 1) write(66,"(a)") "readdata.f90:   Startzeitschritt tst = Zeitdifferenz der beiden Start-Datenfiles"
         end if

! Lesen der Daten und umsortieren der Gitterpunkte

         do idx = 1,np
            read(10,"(i8,7(1xES23.15E3))") &
            idummy, X_extrapol(MR,idx), X_extrapol(MD,idx), X_extrapol(ME,idx), X_extrapol(MUr,idx), X_extrapol(MUp,idx), X_extrapol(MJ,idx), X_extrapol(MH,idx)
         end do

! Schliessen des Datenfiles
      close(unit=10)

      if(loglevel >= 1) write(66,"(a,a)") "readdata.f90:   Modell-Datei eingelesen:", filename(1:filenamelen)

      RETURN




333 continue  ! Lesen des Daten-Files zum alten Zeitpunkt nicht erfolgreich oder nicht notwendig (relax)

      ! damit das vorschaetzen in newton.f90 keinen Fehler ergibt
      ! werden 'X_extrapol' und 'tsta' folgendermassen festgesetzt
      X_extrapol(:,:) = XA(:,:)
      tsta            = tst

      if (loglevel >= 1) write(66,"(a)") &
                         "readdata.f90:   kein Daten-File fuer den alten Zeitpunkt vorhanden, daher X_extrapol(:,:) = XA(:,:)"

      if(tst == z0) then
         tst = z1; tsta = z1
         if (loglevel >= 1) write(66,"(a)")"readdata.f90:   Startzeitschritt ist unbestimmt -- verwende daher tst = 1sec"
      end if

      RETURN


999 continue

      write(* ,"(a,a,a)")"readdata.f90:   Fehler beim Oeffnen des Start-Datenfiles: ",filename(1:filenamelen)," -> STOP"
      write(66,"(a,a,a)")"readdata.f90:   Fehler beim Oeffnen des Start-Datenfiles: ",filename(1:filenamelen)," -> STOP"
      STOP

END SUBROUTINE READDATA

